import java.util.*;

public class Croupier {

        Deck deck;
        Card[][] playerCards;
        Tokens[] tokens;
       
        int iloscGraczy;
        int stan = 0;
        int naStole;
        int stawka;
        int najwyzsza;
        boolean all_in = false;
        
        Croupier(int iloscGraczy)
        {
            this.iloscGraczy = iloscGraczy;
        }
        
        void tasowanie(){
            
            if( iloscGraczy>=2 && iloscGraczy<=4 )
            {
                    deck = new Deck();
                   
                    playerCards = new Card[iloscGraczy][5];
                  
                    for(int i = 0; i < iloscGraczy; i++)
                    {
                        
                            for(int j = 0; j < 5; j++)
                            {
                                    playerCards[i][j] = new Card(0,0);
                                    if(tokens[i].tokens > 0)
                                    {
                                        playerCards[i][j] = getCard();
                                    }
                            }
                            
                    }
            }
        }
       
        Card getCard(){
                return deck.getCard();
        }
       
        void swapCards(int[] pozycje,int numerGracza){
               
                if( numerGracza>=0 && numerGracza<=3 )
                {      
                        for( int p=0; p<4; p++ )
                        {
                                if(pozycje[p]>=1 && pozycje[p]<=5)
                                {
                                    playerCards[numerGracza][pozycje[p]-1] = getCard();
                                }
                        }
                }
        }
        
        static String showFigure(int wartosc){
            String figura = "";
            
            String[] figures = { "Walet","Dama","Krol","As" };
            
            if(wartosc > 10){
                for(int i=11;i<15;i++){
                    if(wartosc == i){
                        figura = figures[i-11];
                    }
                }
            }
            else
            {
                figura = Integer.toString(wartosc);
            }
            
            return figura;
        }
        
        static String showColor(int wartosc){
            String color = "";

            String[] colors = { "Kier","Pik","Karo","Trefl" };

            for( int i=0; i<4; i++ )
            {
                    if( wartosc == i)
                            color = colors[i];
            }
            
            return color;
        }
   
    /* Licytacja */
    void Auction(int poczatkowaIlosc,int iloscGraczy){
        
        tokens = new Tokens[iloscGraczy];               // tworzenie zetonow dla kazdego gracza z poczatkowa iloscia
        
        for(int i = 0; i < iloscGraczy; i++)
        {
            tokens[i] = new Tokens(poczatkowaIlosc);     
        }
    }
    
    void startAuction(int wpisowe){                  // wszyscy gracze wnosza zaklady obowiazkowe
        
        for( int i = 0; i < iloscGraczy; i++  ) 
        {
           if( tokens[i].tokens <= 0 || tokens[i].tokens - wpisowe < 0)     //jesli gracz ma niewystarczajaca ilosc zetonow
               tokens[i].wGrze = false;
           else
               tokens[i].wGrze = true;
            
           if(tokens[i].wGrze )                                             //pobieranie wpisowego jesli gracz jest w grze 
           {      
               tokens[i].tokens = tokens[i].tokens - wpisowe;
               naStole = naStole + wpisowe;
           }                  
           stawka = 0;
        }        
    }
    
    String Round(int numerGracza,int zagranie,int stawkaWpisana){
    
    switch (zagranie){
            case 1:{
                    return "Gracz czeka";   // check
                   }
            case 2:{
                    naStole = naStole + stawkaWpisana;
                    najwyzsza = stawkaWpisana;
                    tokens[numerGracza].tokens = tokens[numerGracza].tokens - stawkaWpisana;
                    return "Ustalono nowa stawke";
            }
            case 3:{
                    tokens[numerGracza].wGrze = false;                      // fold 
                    return "Gracz "+ (numerGracza+1) +"wycofuje sie z rozgrywki";
            }
            case 4:{
                    if(stawkaWpisana > najwyzsza && tokens[numerGracza].tokens-stawkaWpisana >=0){        //raise
                    naStole = naStole + stawkaWpisana;
                    najwyzsza = stawkaWpisana;
                    tokens[numerGracza].tokens = tokens[numerGracza].tokens - stawka;
                    return "Ustalono nowa stawke"; 
                    }
                    else{
                    return "Blad wybranego zagrania!";    
                    }
            }
            case 5:{
                    if(tokens[numerGracza].tokens >= najwyzsza){
                    naStole = naStole + najwyzsza;                          // Call - gracz musi miec ilosc żetonow >= najwyzsza 
                    tokens[numerGracza].tokens = tokens[numerGracza].tokens - najwyzsza;  
                    return "Gracz "+ (numerGracza+1) +"wyrownal stawke";
                    }
                    else
                        return "Blad wybranego zagrania!";
            }
            case 6:{
                    if(tokens[numerGracza].tokens < najwyzsza){
                    naStole = naStole + tokens[numerGracza].tokens;         // all-in ilosc zetonow gracza musi byc < najwyzszej 
                    tokens[numerGracza].tokens = 0;
                    all_in = true;
                    return "Zagranie all-in";
                    }
                    else
                        return "Blad wybranego zagrania!";
            }
        }
        return "";
    }
    
    String roundBot(int numerGracza){
        
        if( all_in ){
                tokens[numerGracza].wGrze = false;                  // jesli nie wycofuje sie z gry 
                return "Gracz "+(numerGracza+1)+" wycofuje sie z gry";
        }
        else
            if( najwyzsza != 0)
            {
                if( tokens[numerGracza].tokens - najwyzsza > 0 )        // jesli go stac gra call 
                        {
                        naStole = naStole + najwyzsza;
                        tokens[numerGracza].tokens = tokens[numerGracza].tokens - najwyzsza;
                        return "Licytacja - Call";
                        }
                else
                    {
                    tokens[numerGracza].wGrze = false;                  // jesli nie wycofuje sie z gry 
                    return "Gracz "+(numerGracza+1)+" wycofuje sie z gry";
                    }
            }
            else
                {
                Random x = new Random();
                int k = 1+x.nextInt(tokens[numerGracza].tokens)/2;
                naStole = naStole + k;
                najwyzsza = k;
                stawka = k;
                return "Gracz "+(numerGracza+1)+"ustanawia stawke: "+k;
                }
        
    }
    
    void endAuction(int winner){
        
        if( winner != 0 )                       // jesli jest zwyciezca 
        {
            tokens[winner-1].tokens = tokens[winner-1].tokens + naStole;    // dodanie zwyciezcy zetonow ze stolu 
            naStole = 0;
            stawka = 0;
            najwyzsza = 0;
            tokens[winner-1].liczbaZwyciestw = tokens[winner-1].liczbaZwyciestw + 1;  // dodanie 1 do ilosci zwyciestw
        }
        else
            {
            naStole = 0;                    // jesli nie ma zwyciezcy zetony zostaja u krupiera ( znikaja z gry )
            stawka = 0;
            }
        naStole = 0;
        stawka = 0;
        najwyzsza = 0;
        all_in = false;
    }
    
    int sendStan(){
        
        if(stan == 4){
            return 4;       //wymiana
        }
        if(all_in){
            stan = 1;
            return 1;    //bylo all-in
        }
        if(najwyzsza == 0){
            stan = 2;
            return 2;    //check/bet/fold
        }
        if(najwyzsza != 0){
            stan = 3;
            return 3;    //call/raise/fold/all-in
        }
        
        return 0;
    }
    
}
